package com.ruoyi.ai.domain;

import lombok.Data;

import java.util.List;

/**
 * 消息参数返回体
 *
 * @author xudm
 * @date 2024年10月18日15:30:25
 */
@Data
public class MessageParamResBody {
    /**
     * 本次请求的唯一标识
     */
    private String id;
    /**
     * 本次请求实际使用的模型名称和版本  doubao-pro-4k-240515
     */
    private String model;
    /**
     * 本次请求的 Unix 时间戳
     */
    private Integer created;
    /**
     * 固定为 chat.completion
     */
    private String object;
    /**
     * 本次请求的 tokens 用量
     */
    private Usage usage;
    /**
     * 本次请求的模型输出内容
     */
    private List<Choice> choices;

    @Data
    public static class Choice {
        /**
         * 当前元素在 choices 列表的索引
         */
        private Integer index;
        /**
         * 模型停止生成 token 的原因。可能的值包括：
         * <p>
         * stop：模型输出自然结束，或因命中请求参数 stop 中指定的字段而被截断
         * length：模型输出因达到请求参数 max_token 指定的最大 token 数量而被截断
         * content_filter：模型输出被内容审核拦截
         * tool_calls：模型调用了工具
         */
        private String finish_reason;
        /**
         * 模型输出的内容
         */
        private Message message;
        /**
         * 当前内容的对数概率信息
         */
        private ChoiceLogprobs logprobs;
    }

    @Data
    public static class Message {
        /**
         * 固定为 assistant
         */
        private String role;
        /**
         * 模型生成的消息内容，content 与 tool_calls 字段二者至少有一个为非空
         */
        private String content;
        /**
         * 模型调用的工具列表，content 与 tool_calls 字段二者至少有一个为非空
         */
        private List<MessageToolCall> tool_calls;
    }

    @Data
    static class Usage {
        /**
         * 输入的 prompt token 数量
         */
        private Integer prompt_tokens;
        /**
         * 模型生成的 token 数量
         */
        private Integer completion_tokens;
        /**
         * 本次请求消耗的总 token 数量（输入 + 输出）
         */
        private Integer total_tokens;
    }

    @Data
    static class ChoiceLogprobs {
        /**
         * message列表中每个 content 元素中的 token 对数概率信息
         */
        private List<TokenLogprob> content;
    }

    @Data
    static class TokenLogprob {
        /**
         * 当前 token
         */
        private String token;
        /**
         * 当前 token 的 UTF-8 值，格式为整数列表。当一个字符由多个 token 组成（表情符号或特殊字符等）时可以用于字符的编码和解码。
         * 如果 token 没有 UTF-8 值则为空。
         */
        private byte[] bytes;
        /**
         * 当前 token 的对数概率
         */
        private Float logprob;
        /**
         * 在当前 token 位置最有可能的标记及其对数概率的列表。在一些情况下，返回的数量可能比请求参数 top_logprobs 指定的数量要少。
         */
        private List<TopLogprob> top_logprobs;
    }

    @Data
    static class TopLogprob {
        /**
         * 当前 token
         */
        private String token;
        /**
         * 当前 token 的 UTF-8 值，格式为整数列表。当一个字符由多个 token 组成（表情符号或特殊字符等）时可以用于字符的编码和解码。
         * 如果 token 没有 UTF-8 值则为空。
         */
        private byte[] bytes;
        /**
         * 当前 token 的对数概率
         */
        private Float logprob;
    }

    @Data
    static class MessageToolCall {
        private String id;
        private String type;
        private Function function;
    }

    @Data
    static class Function {
        private String name;
        private String arguments;
    }
}
